فارسی

بررسی عمیقی از تراکنش‌های توزیع‌شده و پروتکل تعهد دو فازی (2PC). معماری، مزایا، معایب و کاربردهای عملی آن را در سیستم‌های جهانی بیاموزید.

تراکنش‌های توزیع‌شده: یک بررسی عمیق بر روی تعهد دو فازی (2PC)

در دنیای به هم پیوسته‌تر امروز، برنامه‌ها اغلب نیاز دارند با داده‌های ذخیره شده در سیستم‌های متعدد و مستقل تعامل داشته باشند. این امر منجر به مفهوم تراکنش‌های توزیع‌شده می‌شود، جایی که یک عملیات منطقی واحد نیاز به ایجاد تغییرات در چندین پایگاه داده یا سرویس دارد. اطمینان از سازگاری داده‌ها در چنین سناریوهایی بسیار مهم است و یکی از شناخته‌شده‌ترین پروتکل‌ها برای دستیابی به این هدف، تعهد دو فازی (2PC) است.

تراکنش توزیع‌شده چیست؟

یک تراکنش توزیع‌شده مجموعه‌ای از عملیات است که بر روی سیستم‌های متعدد و از نظر جغرافیایی پراکنده انجام می‌شود و به عنوان یک واحد اتمی واحد در نظر گرفته می‌شود. این بدان معناست که یا تمام عملیات‌های موجود در تراکنش باید موفق شوند (commit)، یا هیچ‌کدام نباید (rollback). این اصل «همه یا هیچ چیز» یکپارچگی داده‌ها را در سراسر سیستم توزیع‌شده تضمین می‌کند.

سناریویی را در نظر بگیرید که در آن یک مشتری در توکیو از طریق یک سیستم هواپیمایی از توکیو به لندن پرواز رزرو می‌کند و همزمان اتاقی در هتل لندن را از طریق یک سیستم رزرو هتل دیگر رزرو می‌کند. این دو عملیات (رزرو پرواز و رزرو هتل) در حالت ایده‌آل باید به عنوان یک تراکنش واحد در نظر گرفته شوند. اگر رزرو پرواز موفقیت‌آمیز باشد اما رزرو هتل ناموفق باشد، سیستم در حالت ایده‌آل باید رزرو پرواز را لغو کند تا از گیر افتادن مشتری در لندن بدون محل اقامت جلوگیری شود. این رفتار هماهنگ، جوهر یک تراکنش توزیع‌شده است.

معرفی پروتکل تعهد دو فازی (2PC)

پروتکل تعهد دو فازی (2PC) یک الگوریتم توزیع‌شده است که اتمیت را در میان چندین مدیر منبع (به عنوان مثال، پایگاه‌های داده) تضمین می‌کند. این پروتکل شامل یک هماهنگ‌کننده مرکزی و چندین شرکت‌کننده است که هر کدام مسئول مدیریت یک منبع خاص هستند. این پروتکل در دو فاز مجزا عمل می‌کند:

فاز 1: فاز آماده‌سازی

در این فاز، هماهنگ‌کننده تراکنش را آغاز می‌کند و از هر شرکت‌کننده می‌خواهد که برای commit یا rollback تراکنش آماده شود. مراحل شامل موارد زیر است:

  1. هماهنگ‌کننده یک درخواست آماده‌سازی ارسال می‌کند: هماهنگ‌کننده یک پیام «prepare» به همه شرکت‌کنندگان ارسال می‌کند. این پیام نشان می‌دهد که هماهنگ‌کننده آماده commit کردن تراکنش است و از هر شرکت‌کننده درخواست می‌کند که آماده انجام این کار شود.
  2. شرکت‌کنندگان آماده می‌شوند و پاسخ می‌دهند: هر شرکت‌کننده درخواست آماده‌سازی را دریافت می‌کند و اقدامات زیر را انجام می‌دهد:
    • اقدامات لازم را برای اطمینان از اینکه می‌تواند تراکنش را commit یا rollback کند، انجام می‌دهد (به عنوان مثال، نوشتن logهای redo/undo).
    • یک «رای» به هماهنگ‌کننده ارسال می‌کند و یا «آماده به commit» (رای «yes») یا «نمی‌تواند commit کند» (رای «no») را نشان می‌دهد. یک رای «no» می‌تواند به دلیل محدودیت‌های منابع، شکست اعتبارسنجی داده‌ها یا خطاهای دیگر باشد.

برای شرکت‌کنندگان ضروری است که تضمین کنند می‌توانند تغییرات را پس از رأی «yes» commit یا rollback کنند. این معمولاً شامل حفظ تغییرات در حافظه پایدار (به عنوان مثال، دیسک) می‌شود.

فاز 2: فاز Commit یا Rollback

این فاز توسط هماهنگ‌کننده بر اساس آرای دریافتی از شرکت‌کنندگان در فاز آماده‌سازی آغاز می‌شود. دو نتیجه احتمالی وجود دارد:

نتیجه 1: Commit

اگر هماهنگ‌کننده آرای «yes» را از همه شرکت‌کنندگان دریافت کند، با commit کردن تراکنش ادامه می‌دهد.

  1. هماهنگ‌کننده یک درخواست Commit ارسال می‌کند: هماهنگ‌کننده یک پیام «commit» را به همه شرکت‌کنندگان ارسال می‌کند.
  2. شرکت‌کنندگان Commit می‌کنند: هر شرکت‌کننده درخواست commit را دریافت می‌کند و تغییرات مرتبط با تراکنش را به طور دائمی در منبع خود اعمال می‌کند.
  3. شرکت‌کنندگان تأیید می‌کنند: هر شرکت‌کننده یک پیام تأیید به هماهنگ‌کننده ارسال می‌کند تا تأیید کند که عملیات commit موفقیت‌آمیز بوده است.
  4. هماهنگ‌کننده کامل می‌کند: هماهنگ‌کننده پس از دریافت تأییدیه‌ها از همه شرکت‌کنندگان، تراکنش را به عنوان تکمیل شده علامت‌گذاری می‌کند.

نتیجه 2: Rollback

اگر هماهنگ‌کننده حتی یک رأی «no» از هر شرکت‌کننده دریافت کند، یا اگر منتظر پاسخ از یک شرکت‌کننده باشد و زمانش تمام شود، تصمیم می‌گیرد که تراکنش را rollback کند.

  1. هماهنگ‌کننده یک درخواست Rollback ارسال می‌کند: هماهنگ‌کننده یک پیام «rollback» را به همه شرکت‌کنندگان ارسال می‌کند.
  2. شرکت‌کنندگان Rollback می‌کنند: هر شرکت‌کننده درخواست rollback را دریافت می‌کند و هر تغییری را که در آماده‌سازی تراکنش ایجاد شده بود، لغو می‌کند.
  3. شرکت‌کنندگان تأیید می‌کنند: هر شرکت‌کننده یک پیام تأیید به هماهنگ‌کننده ارسال می‌کند تا تأیید کند که عملیات rollback موفقیت‌آمیز بوده است.
  4. هماهنگ‌کننده کامل می‌کند: هماهنگ‌کننده پس از دریافت تأییدیه‌ها از همه شرکت‌کنندگان، تراکنش را به عنوان تکمیل شده علامت‌گذاری می‌کند.

مثال: پردازش سفارش تجارت الکترونیک

سیستم تجارت الکترونیکی را در نظر بگیرید که در آن یک سفارش شامل به‌روزرسانی پایگاه داده موجودی و پردازش پرداخت از طریق یک درگاه پرداخت جداگانه است. اینها دو سیستم جداگانه هستند که باید در یک تراکنش توزیع‌شده شرکت کنند.

  1. فاز آماده‌سازی:
    • سیستم تجارت الکترونیک (هماهنگ‌کننده) یک درخواست آماده‌سازی را به پایگاه داده موجودی و درگاه پرداخت ارسال می‌کند.
    • پایگاه داده موجودی بررسی می‌کند که آیا اقلام درخواستی موجود هستند یا خیر و آنها را رزرو می‌کند. سپس اگر موفقیت‌آمیز بود، رای «yes» می‌دهد یا اگر اقلام موجود نباشند، رای «no» می‌دهد.
    • درگاه پرداخت، پرداخت را از قبل تأیید می‌کند. سپس اگر موفقیت‌آمیز بود، رای «yes» می‌دهد یا اگر تأییدیه ناموفق بود (به عنوان مثال، موجودی کافی نبود)، رای «no» می‌دهد.
  2. فاز Commit/Rollback:
    • سناریوی Commit: اگر هم پایگاه داده موجودی و هم درگاه پرداخت رای «yes» بدهند، هماهنگ‌کننده یک درخواست commit به هر دو ارسال می‌کند. پایگاه داده موجودی به‌طور دائم تعداد موجودی را کاهش می‌دهد و درگاه پرداخت پرداخت را ثبت می‌کند.
    • سناریوی Rollback: اگر پایگاه داده موجودی یا درگاه پرداخت رای «no» بدهند، هماهنگ‌کننده یک درخواست rollback به هر دو ارسال می‌کند. پایگاه داده موجودی اقلام رزرو شده را آزاد می‌کند و درگاه پرداخت، پیش‌تأیید را باطل می‌کند.

مزایای تعهد دو فازی

معایب تعهد دو فازی

جایگزین‌هایی برای تعهد دو فازی

به دلیل محدودیت‌های 2PC، چندین رویکرد جایگزین برای مدیریت تراکنش‌های توزیع‌شده ظهور کرده‌اند. اینها شامل موارد زیر است:

کاربردهای عملی تعهد دو فازی

علی‌رغم محدودیت‌های آن، 2PC هنوز در سناریوهای مختلفی استفاده می‌شود که در آن سازگاری قوی یک نیاز حیاتی است. برخی از نمونه‌ها عبارتند از:

پیاده‌سازی تعهد دو فازی

پیاده‌سازی 2PC مستلزم در نظر گرفتن دقیق عوامل مختلف از جمله موارد زیر است:

ملاحظات جهانی برای تراکنش‌های توزیع‌شده

هنگام طراحی و پیاده‌سازی تراکنش‌های توزیع‌شده در یک محیط جهانی، باید عوامل اضافی متعددی را در نظر گرفت:

نتیجه‌گیری

تراکنش‌های توزیع‌شده و پروتکل تعهد دو فازی (2PC) مفاهیم اساسی برای ساخت سیستم‌های توزیع‌شده قوی و سازگار هستند. در حالی که 2PC یک راه‌حل ساده و به‌طور گسترده پذیرفته‌شده برای اطمینان از اتمیت ارائه می‌دهد، محدودیت‌های آن، به‌ویژه در مورد مسدود شدن و نقطه شکست واحد، نیاز به بررسی دقیق رویکردهای جایگزین مانند Sagas و سازگاری نهایی دارد. درک تعادل بین سازگاری قوی، در دسترس بودن و عملکرد برای انتخاب رویکرد مناسب برای نیازهای برنامه خاص شما ضروری است. علاوه بر این، هنگام فعالیت در یک محیط جهانی، ملاحظات اضافی در مورد تأخیر شبکه، مناطق زمانی، بومی‌سازی داده‌ها و انطباق نظارتی باید برای اطمینان از موفقیت تراکنش‌های توزیع‌شده مورد توجه قرار گیرد.